package com.dojotec.biblioteca.jsf.dao;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import com.dojotec.biblioteca.jsf.domain.Usuario;
import com.dojotec.biblioteca.jsf.domain.UsuarioRepository;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

/**
 *
 * @author Alan Almeida
 */

public class UsuarioDAO implements UsuarioRepository {
     
    @Override
    public Usuario salvar(Usuario usuario) {
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            em.persist(usuario);
            em.getTransaction().commit();
            return usuario;
        } catch (Exception e) {
            em.getTransaction().rollback();
            throw new UnsupportedOperationException("Erro ao salvar o usuário. "+e.getMessage());
        } finally {
            em.close();
        }
    }

    @Override
    public void atualizar(Usuario usuario) {
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            em.merge(usuario);
            em.getTransaction().commit();
        } catch (Exception e) {
            em.getTransaction().rollback();
            throw new UnsupportedOperationException("Erro ao atualizar o usuário. "+e.getMessage());
        } finally {
            em.close();
        }
    }

    @Override
    public void excluir(Usuario usuario) {
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            em.remove(em.merge(usuario));
            em.getTransaction().commit();
        } catch (Exception e) {
            em.getTransaction().rollback();
            throw new UnsupportedOperationException("Erro ao excluir o usuário. "+e.getMessage());
        } finally {
            em.close();
        }
    }

    @Override
    public Usuario buscarPorId(Long id) {
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            Query q = em.createNamedQuery("usuario.buscarPorId").setParameter("id", id);
            em.getTransaction().commit();
            return (Usuario)q.getSingleResult();
        } catch (Exception e) {
            em.getTransaction().rollback();
            throw new UnsupportedOperationException("Erro ao buscar o usuário. "+e.getMessage());
        } finally {
            em.close();
        }
    }

    @Override
    public List<Usuario> buscarTodos() {
        EntityManager em = emf.createEntityManager();
        try {
            em.getTransaction().begin();
            Query q = em.createNamedQuery("usuario.buscarTodos");
            em.getTransaction().commit();
            return q.getResultList();
        } catch (Exception e) {
            em.getTransaction().rollback();
            throw new UnsupportedOperationException("Erro ao buscar todos os usuários. "+e.getMessage());
        } finally {
            em.close();
        }
    }
}
